PImage img1, img2, img3, img4, i_cl;
PImage back, snp, block, fire;
int snakeX=0, snakeY=0;
color snakeCol=color(255,204,126);
int []snakesX = new int[100];
int []snakesY = new int[100];
int snakeSize=1;

int moveX=0, moveY=0;
float speed=3;

int foodX=-1, foodY=-1;
float per=1;

int blockX=-1, blockY=-1;
boolean bl_check=true;

int winSize=200;
boolean gameOver=false;
boolean check=true;
PFont Font1=createFont("Arial",24,true);
PFont Font2=createFont("Arial",14,true);

void setup(){
  stroke(13,52,8);
  size(winSize,winSize);
  snakeX=width/2-5;
  snakeY=height/2-5;
} 
  
void draw(){
  if(speed%10==0){
    back=loadImage("back.jpg");
    image(back,0,0);
    runGame();
  }
  speed++;
}

void restart(){
  snakeX=width/2-5;
  snakeY=height/2-5;
  gameOver=false;
  check=true;
  bl_check=true;
  snakeSize=1; 
  moveY=0;
  moveX=0;
}

void runGame(){
  if(gameOver==false){  
    drawfood();
    drawSnake();
    snakeMove();
    eatFood();
    eatMe();
    getBlock();
    drawBlock();
  }
  else{
      String strS="game over";
      textAlign(CENTER);
      textFont(Font1);
      text(strS,100,100,40); 
      String strR="press R to restart";
      textFont(Font2);
      text(strR,100,130,40);
   }
}

void eatMe(){
   for(int i=1; i<snakeSize; i++){
       if(snakeX==snakesX[i] && snakeY==snakesY[i]){
          gameOver=true; 
      }
   }  
}

void eatFood(){
  if(foodX==snakeX && foodY==snakeY){
     check=true;
     snakeSize++; 
     per=(int)random(1,5);
     bl_check=true;
  }
}

void drawfood(){
  img1=loadImage("cherry.png");
  img2=loadImage("green_apple.png");
  img3=loadImage("red_apple.png");
  img4=loadImage("banana.png");
  i_cl=loadImage("cloud.png");
  while(check){
    int x=(int)random(1,winSize/10);
    int y=(int)random(1,winSize/10);
    foodX=5+x*10;
    foodY=5+y*10;    
    for(int i=0; i<snakeSize; i++){
       if(x==snakesX[i] && y==snakesY[i]){
         check=true;
         i=snakeSize;
       }else check=false; 
    } 
  }  
  image(i_cl,foodX-7,foodY-7,14,14);
  if (per==1) image (img1,foodX-5,foodY-5,10,10);
  if (per==2) image (img2,foodX-5,foodY-5,10,10);
  if (per==3) image (img3,foodX-5,foodY-5,10,10);
  if (per==4) image (img4,foodX-5,foodY-5,10,10);
}
  
void drawSnake(){
  fill(snakeCol);
  for(int i=0; i<snakeSize; i++) {
    int X=snakesX[i];
    int Y=snakesY[i];
    snp=loadImage("snake_part.png");
    image(snp,X-5,Y-5);
  }  
  for(int i=snakeSize; i>0; i--){
    snakesX[i]=snakesX[i-1];
    snakesY[i]=snakesY[i-1];
  }
}

void snakeMove(){
  snakeX+=moveX;
  snakeY+=moveY;
  if(snakeX>winSize-5 || snakeX<5 || snakeY>winSize-5 || snakeY<5){ 
     gameOver=true; 
  }
  snakesX[0]=snakeX;
  snakesY[0]=snakeY;  
} 
        
void keyPressed(){
  if(keyCode=='R'){restart();}
  if(keyCode==RIGHT){if(snakesX[1]!=snakesX[0]+10){ moveX=10; moveY=0;}}
  if(keyCode==DOWN){if(snakesY[1]!=snakesY[0]+10){ moveX=0; moveY=10;}}
  if(keyCode==LEFT){if(snakesX[1]!=snakesX[0]-10){ moveX=-10; moveY=0;}}
  if(keyCode==UP){if(snakesY[1]!=snakesY[0]-10){ moveX=0; moveY=-10;}}
}

void getBlock(){
  if(blockX==snakeX && blockY==snakeY){
     bl_check=true;
     gameOver=true;
  }
}
void drawBlock(){
  block=loadImage("block.png");
  while(bl_check){
    int x=(int)random(1,winSize/10);
    int y=(int)random(1,winSize/10);
    blockX=5+x*10;
    blockY=5+y*10;   
    for(int i=0; i<snakeSize; i++)
      if(x==snakesX[i] && y==snakesY[i]){
        bl_check=true;
      }
      else{
        bl_check=false; 
      }
  } 
  image(block,blockX-5,blockY-5);
}

/* 
мелковато как-то все (Братухин М.Ю.)
и нет никаких комментариев к коду\

P.S. как убедится, что блок и фрукт не нарисуются на месте змейки?

и что "лужица" и фрукт не наложатся на одну клетку?
*/
